rem ---------import required libraries----------
rem --------------------------------------------
 import "Speed.lib"
 import "Keycodes.lib"
rem Tilemap.lib
rem AWRCollision.lib
rem -----------------------------------------------------------
 constant:

WIDTH 640
HEIGHT 480

PUCK_IMAGE 0
BAT_IMAGE 1
BAT2_IMAGE 2
BAT_CLEAR_IMAGE 3
PUCK_CLEAR_IMAGE 4
	
rem ===========================================================
rem -----------------------------------------------------------
 hidden:

set caret 320,140
center "AIR HOCKEY"
center ""
center "Loading - please wait ...."


 set window 16, 16, WIDTH,HEIGHT
 set redraw off
create font 0,"Arial Black",24,true,false,false,true
save font 0,"Arial Black24.txt","Arial Black24.bmp"

create font 1,"Arial Black",48,true,false,false,true
save font 1,"Arial Black48.txt","Arial Black48.bmp"

create font 2,"Arial Black",12,true,false,false,true
save font 2,"Arial Black12.txt","Arial Black12.bmp"





load image PUCK_IMAGE, "data/puck.bmp"
set image colorkey PUCK_IMAGE,0,0,0

load image PUCK_CLEAR_IMAGE, "data/puck_clear.bmp"
set image colorkey PUCK_CLEAR_IMAGE,0,0,0


load image BAT_IMAGE, "data/bat1.bmp"
set image colorkey BAT_IMAGE,0,0,0

load image BAT2_IMAGE, "data/bat2.bmp"
set image colorkey BAT2_IMAGE,0,0,0

load image BAT_CLEAR_IMAGE, "data/bat_clear.bmp"
set image colorkey BAT_CLEAR_IMAGE,0,0,0


rem ===========================================================
rem -----------------------------------------------------------
visible:
rem initialise variables


rem ------------   puck   -----------------
puck_x# = 580.0
puck_y# = 380.0

puck_dy# = 4.0
puck_dx# = 0.1
puck_can_move = true
rem to INCREASE puck speed use a LOWER number 5 fast... 10 slow
puck_speed# = 7.5


rem ------------   bat   -------------------

bat_x# = 320.0
bat_y# = 360.0
bat_dx#
bat_dy#
bat1_timer = 0

rem ------------   bat2 - the enemy  -------------------

bat2_x# = 320.0
bat2_y# = 120.0
bat2_dx# = 0.4
bat2_dy# = 0.4
bat2_can_hit = true
bat2_timer = 0
bat2_timer2 = 0
bat2_speed# = 0.05
rem - a higher number for bat_2_difficulty INCREASES DIFFICULTY .... 1 IS EASY, ABOVE 2 DIFFICULT

bat_2_difficulty# 

rem ===========================================================

rem  ------------   GOALS  ------------------

goal_x_p1 = 250
goal_width_p1 = (WIDTH/2 - goal_x_p1)  * 2


goal_x_p2 = 267
goal_width_p2 = 105
rem =========================================================

score_p1
score_p2


 shouldDraw = true
proc MenuScreen

rem ====================================================================================================
rem =====================================   start of game loop   =======================================
rem ====================================================================================================





 do

if keydown("p",true) then wait 5000 
	
rem  -----------------   some timers  ------------------------------

rem block_timer=(block_timer+1)%5

if puck_y < 240.0 
	bat2_timer = bat2_timer + 1
else
	bat2_timer = 0
endif

if puck_y < 75.0
	bat2_timer2 = bat2_timer2 + 1
else
	bat2_timer2 = 0
endif

if puck_y > 405.0

	bat1_timer = bat1_timer + 1
else
	bat1_timer = 0
endif


rem ================================================================

rem ----------------  call procedures  ------------------------------

proc move_puck
proc controls
proc move_bat2
proc bat1_collision
proc bat2_collision
proc check_for_p1_goal
proc check_for_p2_goal

rem =================================================================

rem ---------------  game logic   ----------------------------------


rem ================================================================

rem ---------------  drawing routines  -----------------------------

if shouldDraw
set font 0
set color 32,32,96
 cls
 set color 255,255,255




rem ----------  hockey table  ----------------------

draw line 0,HEIGHT - 60,WIDTH,HEIGHT - 60

draw line 134,38,0,HEIGHT - 60
draw line WIDTH - 134,38,WIDTH,HEIGHT - 60


draw line 150,60,40,HEIGHT - 90
draw line WIDTH  - 150,60,WIDTH - 40,HEIGHT - 90

draw rect 0,HEIGHT - 60,WIDTH,30

draw rect 150,60,118, 22
draw rect 373,60,118, 22


draw line 150,82,50,390
draw line WIDTH  - 150,82,590,390

draw line 134,38,506,38

draw line 268,60,272,38
draw line 272,60,272,38
draw line 272,60,268,80

draw line 373,60,368,38
draw line 368,60,368,38
draw line 368,60,373,80

draw line 368,60,272,60


draw line 10,390,250,390
draw line 390,390,630,390



rem ----  goals  ----------

draw line 250,390,245,420
draw line 390,390,395,420

draw line 395,420,395,450
draw line 245,420,245,450

draw line 250,390,250,420
draw line 390,390,390,420


set color 32,96,255
set caret 320,455
center "PLAYER 1"
set color 255,255,255

set color 0,255,0

set caret 320,10
center "PLAYER 2"
set color 255,255,255


clear transformation
	translate bat_x, bat_y
	scale 1.0 - (abs#(bat_y - 480.0)/1000.0), 1.0 - (abs#(bat_y - 480.0)/1000.0)

if bat_y < 390.0
	draw image BAT_IMAGE
elseif bat_x > 250.0 and bat_x < 390.0
	draw image BAT_IMAGE
else
	draw image BAT_CLEAR_IMAGE
endif 

clear transformation
	translate bat2_x, bat2_y
	scale 1.0 - (abs#(bat2_y - 480.0)/1000.0), 1.0 - (abs#(bat2_y - 480.0)/1000.0)
draw image BAT2_IMAGE


rem -----------------   puck   ----------------------

clear transformation
	translate puck_x, puck_y
	scale 1.0 - (abs#(puck_y - 480.0)/1000.0), 1.0 - (abs#(puck_y - 480.0)/1000.0)

if puck_y < 390.0
	draw image PUCK_IMAGE
elseif puck_x > 250.0 and puck_x < 390.0
	draw image PUCK_IMAGE
else
	draw image PUCK_CLEAR_IMAGE
endif


set caret 60,10
center "PLAYER 1"
center score_p1

set caret 580,10
center "PLAYER 2"
center score_p2

	 redraw

endif
rem =================================================================
	 shouldDraw = SPD_HoldFrameDraw(60)
 until keydown(27) or not running()

rem procedures  ------------------------------    procedures   ------
  
rem ================================================================================
procedure move_puck()
rem slow it down
	puck_dx = puck_dx * 0.998
	puck_dy = puck_dy * 0.998

proc check_collision

if puck_can_move = true
	puck_y = puck_y + puck_dy
	puck_x = puck_x + puck_dx
endif

rem ---- this is for testing - sometimes the puck gets caught / stuck ----
rem ----  at the top of the screen  -  pressing space will shift it   ----
if keydown(VK_SPACE,true)
	if puck_y < 240.0 
		puck_y = puck_y + 10.0
	else
		puck_y = puck_y - 10.0
	endif
endif
endproc

rem ================================================================================
procedure check_collision()
puck_can_move = true


rem --- 
if puck_y >= 405.0 
	if puck_x - 30.0 <= float(goal_x_p1) or puck_x + 30.0 >= float(goal_x_p1 + goal_width_p1) 
		puck_can_move = false
		puck_dy = - puck_dy
		puck_y = puck_y + puck_dy
	endif
endif




if puck_y <= 75.0 
	if puck_x - 22.0 <= float(goal_x_p2) or puck_x + 22.0 >= float(goal_x_p2 + goal_width_p2) 
		puck_can_move = false
		puck_dy = - puck_dy
		puck_y = puck_y + puck_dy
	endif
endif




if puck_x + 30.0 >= float(WIDTH) - ((420.0 - puck_y)/ 3.0) - 30.0;rem and puck_dx > 0.0
	puck_can_move = false

	puck_dx = - puck_dx  - 1.4
	puck_x = puck_x + (puck_dx)
endif

if puck_x - 30.0 <= ((420.0 - puck_y)/ 3.0) + 30.0
	puck_can_move = false

	puck_dx = - puck_dx  + 1.4
	puck_x = puck_x + (puck_dx * 2.0)

endif

rem - limit the puck_dx speed
if puck_dx > 7.0 then puck_dx = 7.0
if puck_dx < - 7.0 then puck_dx = - 7.0


endproc
rem =================================================================================
  procedure controls()

rem Slow down.
	bat_dx = bat_dx*0.95
	bat_dy = bat_dy*0.95
	rem Speed up.
	if keydown(VK_LEFT) then bat_dx = max#(bat_dx - 0.5, -4.0)
	if keydown(VK_RIGHT) then bat_dx = min#(bat_dx + 0.5, 4.0)
	if keydown(VK_UP) then bat_dy = max#(bat_dy - 0.5, -4.0)
	if keydown(VK_DOWN) then bat_dy = min#(bat_dy + 0.5, 4.0)
	rem Move.
	bat_x = bat_x + bat_dx
	bat_y = bat_y + bat_dy
	rem Stay on screen.
	bat_x = min#(max#(bat_x, ((420.0 - bat_y)/ 3.0) + 54.0), float(WIDTH) - ((420.0 - bat_y)/ 3.0) - 54.0 )
	bat_y = min#(max#(bat_y, 240.0), float(height(primary) - height(BAT_IMAGE)))
if bat_y > 410.0 then bat_y = 410.0


if bat1_timer > 160 ;rem and puck_y <= 61.0
					set caret 320,240
					center "PRESS SPACEBAR"
					redraw
					puck_y = puck_y - 10.0
endif




endproc
rem =================================================================================
procedure bat1_collision()
rem --- can't use width(PUCK_IMAGE) in the formulas
rem ----  as it changes --------------------------
rem puck_x and bat_x are the MIDDLE of the image
if puck_x + ((48.0 / 480.0 * puck_y) / 2.0) > bat_x - ((60.0 / 480.0 * bat_y) / 2.0)
	if puck_x - ((48.0 / 480.0 * puck_y)  / 2.0) < bat_x + ((60.0 / 480.0 * bat_y) / 2.0)
 
		if puck_y + ((24.0 / 480.0 * puck_y) / 2.0) > bat_y - ((30.0 / 480.0 * bat_y) / 2.0)

			if puck_y - ((24.0 / 480.0 * puck_y) / 2.0) < bat_y + ((30.0 / 480.0 * bat_y) / 2.0)

				puck_dx = (puck_x - bat_x) / puck_speed
				puck_dy = (puck_y - bat_y) / puck_speed

					puck_y = puck_y + (bat_dy * 1.15) 
					puck_x = puck_x + (bat_dx * 1.05) 

			endif
		endif
	endif
endif
endproc
rem =================================================================================
procedure bat2_collision()
rem --- can't use width(PUCK_IMAGE) in the formulas
rem ----  as it changes --------------------------
rem puck_x and bat_x are the MIDDLE of the image

if puck_x + ((48.0 / 480.0 * puck_y) / 2.0) > bat2_x - ((60.0 / 480.0 * bat2_y) / 2.0)
	if puck_x - ((48.0 / 480.0 * puck_y)  / 2.0) < bat2_x + ((60.0 / 480.0 * bat2_y) / 2.0)
 
		if puck_y + ((24.0 / 480.0 * puck_y) / 2.0) > bat2_y - ((30.0 / 480.0 * bat2_y) / 2.0)

			if puck_y - ((24.0 / 480.0 * puck_y) / 2.0) < bat2_y + ((30.0 / 480.0 * bat2_y) / 2.0)
				puck_dx = (puck_x - bat2_x) / 6.0
				puck_dy = (puck_y - bat2_y) / 6.0
	
					bat2_can_hit = false
					puck_y = puck_y + (bat2_dy * 1.15) 
					puck_x = puck_x + (bat2_dx * 1.05) 

			endif
		endif
	endif
endif
endproc
rem =====================================================================================
procedure move_bat2()

if puck_dy < 0.0 then bat2_can_hit = true
if bat2_timer > 250  then bat2_can_hit = true
		rem Slow down.
			bat2_dx = bat2_dx*0.95
			bat2_dy = bat2_dy*0.95
	
		rem Move.
			bat2_x = bat2_x + bat2_dx
			bat2_y = bat2_y + bat2_dy
		if bat2_can_hit = true
			if puck_x < bat2_x
				bat2_dx = max#(bat2_dx - bat2_speed, - 6.0)
			else
				bat2_dx = min#(bat2_dx + bat2_speed, 6.0)
			endif

				if puck_y > bat2_y 
rem the +0.05 below dictates the forward speed of bat2 - a larger number increases speed but makes it more choppy
					bat2_dy = min#(bat2_dy + 0.05, 6.0)
					bat2_y = bat2_y - 0.2
				else
					rem this line dictates the speed that the bat2 can move backwards.....
					bat2_dy = - bat_2_difficulty
				endif	
		endif

if bat2_y < 65.0 then bat2_y = 65.0
if bat2_y > 240.0 then bat2_y = 240.0

					rem this stops the puck getting trapped at the top 

				if bat2_timer2 > 160 ;rem and puck_y <= 61.0
					set caret 320,240
					center "PRESS SPACEBAR"
					redraw
					puck_y = puck_y + 10.0
				endif

endproc
rem ==================================================================================
rem ==================================================================================
procedure check_for_p1_goal()

if puck_y <= 75.0 
	if puck_x - 22.0 > float(goal_x_p2) and puck_x + 22.0 < float(goal_x_p2 + goal_width_p2) 
		set caret 320,90
		set font 1
		score_p1 = score_p1 + 1
		center "GOAL!"
set caret 320,220
center score_p1," - ",score_p2

		redraw
		wait 3000

if score_p1 > 4
	proc EndGame
endif


		puck_x = 320.0
		puck_y = 240.0
		puck_dy = 0.5
		bat_x = 320.0
		bat_y = 360.0
		bat2_x = 320.0
		bat2_y = 120.0
	endif
endif




endproc
rem ==================================================================================

procedure check_for_p2_goal()

if puck_y >= 405.0 
	if puck_x - 30.0 >= float(goal_x_p1) and puck_x + 30.0 <= float(goal_x_p1 + goal_width_p1) 
		rem _y = puck_y + 64.0
		set caret 320,350
		set font 1
		score_p2 = score_p2 + 1
		center "GOAL!"
		set caret 320,220
		center score_p1," - ",score_p2
		redraw
		wait 3000

			if score_p2 > 4
				proc EndGame
			endif


		puck_x = 320.0
		puck_y = 240.0

		puck_dy = - 0.5

		
		bat_x = 320.0
		bat_y = 390.0
		bat2_x = 320.0
		bat2_y = 90.0
	endif
endif




endproc

rem ======================================================================================
procedure EndGame()

rem clear previous message
set color 0,0,0
cls
set color 255,255,255


set caret 320,220
center "Game Over"
redraw
wait 3000

proc MenuScreen
endproc
rem ==================================================================================
rem ==================================================================================
rem ==================================================================================
rem ==================================================================================
rem =====================         MENU SCREEN          ===============================
rem ==================================================================================
rem ==================================================================================
rem ==================================================================================
rem ==================================================================================






procedure MenuScreen()
set font 0

rem ---- reset all variables so that the option to "Start Game" will work ....
rem ---- ....if not, that option will just trigger the EndGame menu again ..

score_p1 = 0
score_p2 = 0
puck_x = 320.0
puck_y = 240.0
do
menuItem = 0
do
if keydown(VK_DOWN,true) and menuItem < 5 then menuItem = menuItem + 1
if keydown(VK_UP,true) and menuItem > 0 then menuItem = menuItem - 1
set color 0,0,0
cls
set color 255,255,255
set caret 320, 170
set color 0,255,255
center "Use Keys To Move in The Menu"
center "Press Space to Select an Item"
set caret 320, 240
rem --------- 
rem -----------------------  start of menu display   ---------------------------------
rem ---------

rem	if menuItem = 0; set color 0,255,255; else; set color 0,96,128;
rem endif
rem center "START THE FULL GAME"
rem --------- 

if menuItem = 1; set color 0,255,255; else; set color 0,96,128;
endif
center "HOW TO PLAY"
rem --------- 

if menuItem = 2; set color 0,255,255; else; set color 0,96,128;
endif
center "PLAY A HARD GAME"


rem --------------
if menuItem = 3; set color 0,255,255; else; set color 0,96,128;
endif
center "PLAY AN EASY GAME"

rem --------- 
if menuItem = 4; set color 0,255,255; else; set color 0,96,128;
endif
center"QUIT"


rem --------- 
if menuItem = 0; set color 0,255,255; else; set color 0,96,128;
endif
redraw
wait 10
until keydown(VK_SPACE,true)

if menuItem = 1
set color 0,0,0
cls
set color 255,0,255
set caret 320,50
center "++++++++++++++++++++++++++++++++++++"
center " HOW TO PLAY AIR HOCKEY "
center "++++++++++++++++++++++++++++++++++++"
center
set color 0,255,255
center "You control the BLUE bat using" 
center
center "the arrow keys. Your aim is to"
center
center "hit the RED puck into the opponents"
center ""
center "goal and defend your own goal."
center""

center "First to 5 wins ...."
center ""
set color 255,255,255
center "Press any key to continue..."
redraw
wait keydown

rem ------------------------
rem elseif menuItem = 0
rem donotreturn = true
elseif menuItem = 2
bat_2_difficulty# = 1.8
puck_speed# = 6.0

donotreturn = true
elseif menuItem = 3
bat_2_difficulty# = 1.2
puck_speed# = 9.0

donotreturn = true
rem ------------
elseif menuItem = 4
end

endif

until menuItem = 2 or menuItem = 3; rem or menuItem = 3

endproc
